import java.util.ArrayList;

class Timbre {

    public static final int ANNEE_COURANTE = 2014;
    public static final int VALEUR_TIMBRE_DEFAUT = 1;
    public static final String PAYS_DEFAUT = "Suisse";
    public static final String CODE_DEFAUT = "lambda";

    public static final int BASE_1_EXEMPLAIRES = 100;
    public static final int BASE_2_EXEMPLAIRES = 1000;
    public static final double PRIX_BASE_1 = 600;
    public static final double PRIX_BASE_2 = 400;
    public static final double PRIX_BASE_3 = 50;

    /*******************************************
     * Completez le programme a partir d'ici.
     *******************************************/
	 private String code = CODE_DEFAUT;
	 private int anneeDemission = ANNEE_COURANTE;
	 private String paysDorigine = PAYS_DEFAUT;
	 private double valeurEnFrancs = VALEUR_TIMBRE_DEFAUT;
	 
	 public Timbre(){}
	 
	 public Timbre(String code){
		 this.code = code;
	 }
	 
	 public Timbre(String code, int anneeDemission){
		 this(code);
		 this.anneeDemission = anneeDemission;
	 }
	 
	 public Timbre(String code, int anneeDemission, String paysDorigine){
		 this(code, anneeDemission);
		 this.paysDorigine = paysDorigine;
	 }
	 
	 public Timbre(String code, int anneeDemission, String paysDorigine, double valeurEnFrancs){
		 this(code, anneeDemission, paysDorigine);
		 this.valeurEnFrancs = valeurEnFrancs;
	 }
	 
	 public double vente(){
		 double prix = 0.0;
		 
		 if(age() < 5){
			 prix = valeurEnFrancs;
		 }
		 else{
			 prix = valeurEnFrancs * age() * 2.5;
		 }
		 return prix;
	 }
	 
	 public int age(){
		 int annee = getAnnee();
		 return ANNEE_COURANTE - annee;
	 }
	 
	 public String getCode(){
		 return code;
	 }
	 
	 public int getAnnee(){
		 return anneeDemission;
	 }
	 
	 public String getPays(){
		 return paysDorigine;
	 }
	 
	 public double getValeurFaciale(){
		 return valeurEnFrancs;
	 }
	 
	 @Override public String toString(){
		 return String.format("Timbre de code %s datant de %s (provenance %s) ayant pour valeur faciale %s francs",
				getCode(), getAnnee(), getPays(), getValeurFaciale());
	 }
/*******************************************
 * Ne rien modifier apres cette ligne.
 *******************************************/
}

class Rare extends Timbre{
	
	private int nombreDexemplaires;
	
	public Rare(int nombreDexemplaires){
		this.nombreDexemplaires = nombreDexemplaires;
	}
	
	public Rare(String code, int nombreDexemplaires) {
		super(code);
		this.nombreDexemplaires = nombreDexemplaires;
	}

	public Rare(String code, int anneeDemission, int nombreDexemplaires){
		super(code, anneeDemission);
		this.nombreDexemplaires = nombreDexemplaires;
	}
	
	public Rare(String code, int anneeDemission, String paysDorigine, int nombreDexemplaires){
		super(code, anneeDemission, paysDorigine);
		this.nombreDexemplaires = nombreDexemplaires;
	}
	
	public Rare(String code, int anneeDemission, String paysDorigine, double valeurEnFrancs, int nombreDexemplaires){
		super(code, anneeDemission, paysDorigine, valeurEnFrancs);
		this.nombreDexemplaires = nombreDexemplaires;
	}
	
	public int getExemplaires(){
		return nombreDexemplaires;
	}
	
	@Override public String toString(){
		return super.toString() + String.format("\nNombre d'exemplaires -> %s", getExemplaires());
	}
	
	public double vente(){
		double prix = 0.0;
		double prixDeBase = 0.0;
		
		if(getExemplaires() < 100){
			prixDeBase = 600;
		}
		else if (getExemplaires() > 100 && getExemplaires() < 1000){
			prixDeBase = 400;
		}
		else{
			prixDeBase = 50;
		}
		
		prix = prixDeBase * (super.age() / 10.0);
		return prix;
	}
	
}

class Commemoratif extends Timbre{

	public Commemoratif(String code) {
		super(code);
	}
	
	public Commemoratif(String code, int anneeDemission) {
		super(code, anneeDemission);
	}
	
	public Commemoratif(String code, int anneeDemission, String paysDorigine) {
		super(code, anneeDemission, paysDorigine);
	}
	
	public Commemoratif(String code, int anneeDemission, String paysDorigine, double valeurEnFrancs) {
		super(code, anneeDemission, paysDorigine, valeurEnFrancs);
	}
	
	@Override public String toString(){
		return super.toString() + String.format("\nTimbre celebrant un evenement");
	}
	
	public double vente(){
		double prix = 0.0;
		prix = super.vente() * 2;
		
		return prix;
	}
}

class Philatelie {

    public static void main(String[] args) {

        // ordre des parametres: nom, annee d'emission, pays, valeur faciale,
        // nombre d'exemplaires
        Rare t1 = new Rare("Guarana-4574", 1960, "Mexique", 0.2, 98);
        
        // ordre des parametres: nom, annee d'emission, pays, valeur faciale
        Commemoratif t2 = new Commemoratif("700eme-501", 2002, "Suisse", 1.5);
        Timbre t3 = new Timbre("Setchuan-302", 2004, "Chine", 0.2);

        Rare t4 = new Rare("Yoddle-201", 1916, "Suisse", 0.8, 3);


        ArrayList<Timbre> collection = new ArrayList<Timbre>();

        collection.add(t1);
        collection.add(t2);
        collection.add(t3);
        collection.add(t4);

        for (Timbre timbre : collection) {
            System.out.println(timbre);
            System.out.println("Prix vente : " + timbre.vente() + " francs");
            System.out.println();
        }
    }
}

